package ebj.common.document_create.pdf.demo;
import java.io.FileOutputStream;  
import java.io.IOException;

import com.itextpdf.text.BaseColor;  
import com.itextpdf.text.Document;  
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;  
import com.itextpdf.text.ExceptionConverter;  
import com.itextpdf.text.Font;  
import com.itextpdf.text.Image;  
import com.itextpdf.text.PageSize;  
import com.itextpdf.text.Paragraph;  
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;  
import com.itextpdf.text.pdf.ColumnText;  
import com.itextpdf.text.pdf.PdfContentByte;  
import com.itextpdf.text.pdf.PdfPCell;  
import com.itextpdf.text.pdf.PdfPTable;  
import com.itextpdf.text.pdf.PdfPageEventHelper;  
import com.itextpdf.text.pdf.PdfTemplate;  
import com.itextpdf.text.pdf.PdfWriter;  
import com.itextpdf.tool.xml.XMLWorkerFontProvider;  

import ebj.common.document_create.helper.ITextHelper;
   
/** 
 * 页眉、页脚 
 * iText5中并没有之前版本HeaderFooter对象设置页眉和页脚，可以利用PdfPageEvent来完成页眉页脚的设置工作。

PdfPageEvent提供了几个pdf在创建时的事件，页眉页脚就是在每页加载完写入的。

每一页加个页码还是很简单的，但是总页码就麻烦了，iText是流模式的写入内容，只有写到最后，才能知道有多少页，那么显示总页数就麻烦了，不过麻烦不代表不可能。

其实iText仅在调用释放模板方法后才将PdfTemplate写入到OutputStream中，否则对象将一直保存在内存中，直到关闭文档。

所以我们可以在最后关闭文档前，使用PdfTemplate写入总页码。可以理解成先写个占位符，然后统一替换。
 * @author zhangwd 
 * @version 1.0 
 * 
 */  
public class PdfDemo_3 {
    public static void create() throws Exception {  
        Document document = new Document(PageSize.A4, 50, 50, 50, 50);  
        PdfWriter writer = PdfWriter.getInstance(document,
                new FileOutputStream(ITextHelper.getAbsoluteOutputFilePath(PdfDemo_3.class.getSimpleName())));  
   
        // 增加页眉页脚  
        writer.setPageEvent(new MyHeaderFooter());  
   
        String title = "凉州词";  
        String content = "黄河远上白云间，一片孤城万仞山。羌笛何须怨杨柳，春风不度玉门关。";  
        document.open();  
   
        Font font = new XMLWorkerFontProvider().getFont("宋体");  
        for (int i = 0; i <100; i++) {  
            document.add(new Paragraph(title, font));  
            document.add(new Paragraph(content,font));  
            document.add(new Paragraph("\n"));  
        }  
        document.close();  
        writer.close();  
    }  
   
    public static void main(String[]args) throws Exception {  
        create();  
    }  
}  
   
/** 
 * iText5中并没有之前版本HeaderFooter对象设置页眉和页脚<br> 
 * 不过，可以利用PdfPageEventHelper来完成页眉页脚的设置工作。<br> 
 * 就是在页面完成但写入内容之前触发事件，插入页眉、页脚、水印等。<br> 
 * 
 * @author zhangwd 
 * @version 1.0 
 * 
 */  
class MyHeaderFooter extends PdfPageEventHelper {  
   
    Font font = new XMLWorkerFontProvider().getFont("宋体", 12, BaseColor.RED);  
   
    // 总页数  
    PdfTemplate totalPage;  
   
    // 打开文档时，创建一个总页数的模版  
    public void onOpenDocument(PdfWriter writer,Document document) {  
        PdfContentByte cb =writer.getDirectContent();  
        totalPage = cb.createTemplate(30, 16);  
    }  
   
    // 一页加载完成触发，写入页眉和页脚  
    public void onEndPage(PdfWriter writer, Document document) {
        PdfPTable table = new PdfPTable(3);
        try {  
            table.setTotalWidth(PageSize.A4.getWidth() - 100);  
            table.setWidths(new int[] { 24, 24, 3});  
            table.setLockedWidth(true);  
            table.getDefaultCell().setFixedHeight(-12);  
            table.getDefaultCell().setBorder(Rectangle.TOP);  
   
            table.addCell(new Paragraph("货币银行学", font));// 可以直接使用addCell(str)，不过不能指定字体，中文无法显示  
            
            table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);  
            table.addCell(new Paragraph("第" + writer.getPageNumber() + "页 |", font));  
   
            // 总页数  
            PdfPCell cell = new PdfPCell(Image.getInstance(totalPage));  
            cell.setBorder(Rectangle.TOP);  
            table.addCell(cell);  
   
            // 将页眉写到document中，位置可以指定，指定到下面就是页脚  
//            table.writeSelectedRows(0, -1, 50,PageSize.A4.getHeight() - 20, writer.getDirectContent());  
            table.writeSelectedRows(0, -1, 50, 39, writer.getDirectContent());  
        } catch (Exception de) {  
            throw new ExceptionConverter(de);  
        }
    }  
   
    // 全部完成后，将总页数的pdf模版写到指定位置  
    public void onCloseDocument(PdfWriter writer,Document document) {  
        String text = "共" + (writer.getPageNumber()) + "页";  
        ColumnText.showTextAligned(totalPage, Element.ALIGN_LEFT, new Paragraph(text,font), 2, 2, 0);  
    }  
}